package com.ruoyi.api;

import com.ruoyi.common.annotation.Anonymous;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 用户资料修改控制器
 * 适配表名：wx_user，字段名：nickname, avatar_url
 */
@RestController
@RequestMapping("/user")
@CrossOrigin("*")
@Anonymous  // 允许匿名访问
public class UserProfileController {

    @Resource
    private JdbcTemplate jdbcTemplate;

    // 头像存储路径
    @Value("${file.upload.path}")
    private String uploadPath;

    // 头像访问前缀
    @Value("${file.access.url}")
    private String accessUrl;

    /**
     * 更新用户资料（支持单独更新头像、昵称或同时更新）
     * 接口：POST /user/profile
     * 适配表：wx_user，字段：nickname, avatar_url
     */
    @PostMapping("/profile")
    public Map<String, Object> updateProfile(
            @RequestParam("openId") String openId,  // 用户唯一标识（必传）
            @RequestParam(value = "file", required = false) MultipartFile avatarFile,  // 头像文件（可选）
            @RequestParam(value = "nickname", required = false) String nickname,  // 昵称（可选）
            HttpServletRequest request) {

        Map<String, Object> result = new HashMap<>();

        try {
            // 1. 验证必填参数
            if (openId == null || openId.trim().isEmpty()) {
                result.put("success", false);
                result.put("message", "openId不能为空");
                return result;
            }

            // 2. 处理头像上传（如果提供了头像文件）
            String avatarUrl = null;
            if (avatarFile != null && !avatarFile.isEmpty()) {
                // 验证文件类型
                String contentType = avatarFile.getContentType();
                if (contentType == null || !contentType.startsWith("image/")) {
                    result.put("success", false);
                    result.put("message", "请上传图片类型文件");
                    return result;
                }

                // 验证文件大小（5MB以内）
                if (avatarFile.getSize() > 5 * 1024 * 1024) {
                    result.put("success", false);
                    result.put("message", "图片大小不能超过5MB");
                    return result;
                }

                // 处理文件路径
                String originalFilename = avatarFile.getOriginalFilename();
                String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
                String fileName = UUID.randomUUID().toString() + extension;
                String dateDir = new SimpleDateFormat("yyyyMMdd").format(new Date());

                // 确保目录存在
                File dateDirFile = new File(uploadPath + File.separator + dateDir);
                if (!dateDirFile.exists()) {
                    boolean created = dateDirFile.mkdirs();
                    if (!created) {
                        result.put("success", false);
                        result.put("message", "无法创建上传目录，请检查权限");
                        return result;
                    }
                }

                // 保存文件
                File destFile = new File(dateDirFile, fileName);
                try {
                    avatarFile.transferTo(destFile);
                } catch (FileNotFoundException e) {
                    result.put("success", false);
                    result.put("message", "文件路径不存在: " + destFile.getAbsolutePath());
                    return result;
                }

                // 生成访问URL
                avatarUrl = accessUrl + dateDir + "/" + fileName;
            }

            // 3. 执行数据库更新（使用新表名wx_user和字段名avatar_url）
            String sql;
            int affectedRows;

            // 判断是否有需要更新的字段
            if (avatarUrl != null || nickname != null) {
                // 使用COALESCE函数：如果参数为null则保留原有值
                // 表名改为wx_user，字段名改为avatar_url
                sql = "UPDATE wx_user SET " +
                        "avatar_url = COALESCE(?, avatar_url), " +
                        "nickname = COALESCE(?, nickname) " +
                        "WHERE openId = ?";
                affectedRows = jdbcTemplate.update(sql, avatarUrl, nickname, openId);
            } else {
                result.put("success", false);
                result.put("message", "请至少提供一个需要更新的字段（头像或昵称）");
                return result;
            }

            // 4. 如果用户不存在则自动创建（使用新表名和字段名）
            if (affectedRows == 0) {
                sql = "INSERT INTO wx_user (openId, avatar_url, nickname) " +
                        "VALUES (?, ?, ?)";
                jdbcTemplate.update(sql,
                        openId,
                        avatarUrl != null ? avatarUrl : "",
                        nickname != null ? nickname : "");
            }

            // 5. 返回更新结果
            result.put("success", true);
            result.put("message", "资料更新成功");

            // 返回更新后的信息
            Map<String, Object> data = new HashMap<>();
            data.put("openId", openId);
            if (avatarUrl != null) data.put("avatarUrl", avatarUrl);  // 前端仍用avatarUrl
            if (nickname != null) data.put("nickname", nickname);
            result.put("data", data);

        } catch (IOException e) {
            result.put("success", false);
            result.put("message", "头像上传失败: " + e.getMessage());
            e.printStackTrace();
        } catch (Exception e) {
            result.put("success", false);
            result.put("message", "数据库操作失败: " + e.getMessage());
            e.printStackTrace();
        }

        return result;
    }

    /**
     * 头像访问接口
     * 路径：GET /avatar/{dateDir}/{fileName}
     */
    @GetMapping("/avatar/{dateDir}/{fileName:.+}")
    public ResponseEntity<byte[]> getAvatar(
            @PathVariable String dateDir,
            @PathVariable String fileName) {
        try {
            // 安全验证
            if (!dateDir.matches("\\d{8}")) {
                return ResponseEntity.badRequest().body(null);
            }
            if (!fileName.matches("[0-9a-fA-F-]+\\.[a-zA-Z0-9]+")) {
                return ResponseEntity.badRequest().body(null);
            }

            // 读取文件
            Path filePath = Paths.get(uploadPath)
                    .resolve(dateDir)
                    .resolve(fileName)
                    .normalize();

            if (!Files.exists(filePath)) {
                return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
            }

            String contentType = Files.probeContentType(filePath);
            if (contentType == null) {
                contentType = MediaType.IMAGE_JPEG_VALUE;
            }

            return ResponseEntity.ok()
                    .contentType(MediaType.parseMediaType(contentType))
                    .body(Files.readAllBytes(filePath));

        } catch (IOException e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
        }
    }
}
